// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once


#if COMMONUSER_OSSV1

// Online Subsystem (OSS v1) includes and forward declares
// OnlineSubsystemTypes: 此头文件包括OSS的各种网络状态类型定义。
#include "OnlineSubsystemTypes.h"
/**
	OnlineSubsystem - Series of interfaces to support communicating with various web/platform layer services.

	IOnlineSubsystem: 支持与各种网站或平台层服务沟通的一系列接口。
*/
class IOnlineSubsystem;
/**
	Generic Error response for OSS calls.

	FOnlineError: 针对OSS回调生成错误回复。
*/
struct FOnlineError;
/**
	using用法:
	1.使用命名空间，using namespaced std;。
	2.作为类型别名，using FOnlineErrorType = FOnlineError;。
	3.继承时，用于使用父类的私有变量，using Friend::Age;。
*/
using FOnlineErrorType = FOnlineError;
using ELoginStatusType = ELoginStatus::Type;

#else

// Online Services (OSS v2) includes and forward declares
#include "Online/Connectivity.h"
#include "Online/OnlineError.h"
namespace UE::Online
{
	enum class ELoginStatus : uint8;
	enum class EPrivilegeResults : uint32;
	enum class EUserPrivileges : uint8;
	using IAuthPtr = TSharedPtr<class IAuth>;
	using IOnlineServicesPtr = TSharedPtr<class IOnlineServices>;
	template <typename OpType>
	class TOnlineResult;
	struct FAuthLogin;
	struct FConnectionStatusChanged;
	struct FExternalUIShowLoginUI;
	struct FAuthLoginStatusChanged;
	struct FQueryUserPrivilege;
	struct FAccountInfo;
}
using FOnlineErrorType = UE::Online::FOnlineError;
using ELoginStatusType = UE::Online::ELoginStatus;

#endif

#include "CommonUserTypes.generated.h"


/** Enum specifying where and how to run online queries */

// 明确说明在哪里和怎样去运行在线参数的枚举。
UENUM(BlueprintType)
enum class ECommonUserOnlineContext : uint8
{
	/** Called from game code, this uses the default system but with special handling that could merge results from multiple contexts */

	// 从游戏代码调用，这是默认系统但是具体地处理从多个上下文合并的结果。
	Game,

	/** The default engine online system, this will always exist and will be the same as either Service or Platform */

	// 这是默认的引擎在线系统，它将会经常存在并且将和其他的服务或平台相同。
	Default,

	/** Explicitly ask for the external service, which may not exist */

	// 明确地请求外部服务，该服务也可能不存在。
	Service,

	/** Looks for external service first, then falls back to default */

	// 首先寻找外部服务，然后回退到默认。
	ServiceOrDefault,

	/** Explicitly ask for the platform system, which may not exist */

	// 明确请求平台系统，该平台系统可能不存在。
	Platform,

	/** Looks for platform system first, then falls back to default */

	// 首先寻找平台系统，然后回退到默认。
	PlatformOrDefault,

	/** Invalid system */

	// 无效系统。
	Invalid
};

/** Enum describing the state of initialization for a specific user */

// 针对具体用户的初始化状态的描述的枚举。
UENUM(BlueprintType)
enum class ECommonUserInitializationState : uint8
{
	/** User has not started login process */

	// 用户还没有开始登陆进程。
	Unknown,

	/** Player is in the process of acquiring a user id with local login */

	// 玩家在本地请求用户ID的进程。
	DoingInitialLogin,

	/** Player is performing the network login, they have already logged in locally */

	// 玩家正在执行网络登陆，它们已经在本地登陆。
	DoingNetworkLogin,

	/** Player failed to log in at all */

	// 玩家登陆失败。
	FailedtoLogin,


	/** Player is logged in and has access to online functionality */

	// 玩家已经登陆并且已经进入在线功能。
	LoggedInOnline,

	/** Player is logged in locally (either guest or real user), but cannot perform online actions */

	// 玩家已经在本地登陆(可能是游客或真实玩家)，但是没有平台在线行为。
	LoggedInLocalOnly,


	/** Invalid state or user */

	// 无效状态或玩家。
	Invalid,
};

/** Enum specifying different privileges and capabilities available to a user */

// 对于用户明确指出不同权限或能力可用性的枚举。
UENUM(BlueprintType)
enum class ECommonUserPrivilege : uint8
{
	/** Whether the user can play at all, online or offline */

	// 用户是否能玩，无论是在线还是离线。
	CanPlay,

	/** Whether the user can play in online modes */

	// 用户是否能在在线模式下玩。
	CanPlayOnline,

	/** Whether the user can use text chat */

	// 用户是否能使用文本聊天。
	CanCommunicateViaTextOnline,

	/** Whether the user can use voice chat */

	// 用于是否能语音聊天。
	CanCommunicateViaVoiceOnline,

	/** Whether the user can access content generated by other users */

	// 用户是否能进入其他用户生成的内容。(可认为是否能进入主页)
	CanUseUserGeneratedContent,

	/** Whether the user can ever participate in cross-play */

	// 用户是否能参与跨平台连接游玩。
	CanUseCrossPlay,

	/** Invalid privilege (also the count of valid ones) */

	// 无效权限(以及有效权限的数量)。
	Invalid_Count					UMETA(Hidden)
};

/** Enum specifying the general availability of a feature or privilege, this combines information from multiple sources */

// 枚举类型，用于指定某项功能或权限的总体可用状态，它综合了来自多个来源的信息。 
UENUM(BlueprintType)
enum class ECommonUserAvailability : uint8
{
	/** State is completely unknown and needs to be queried */

	// 完全未知并且需要去查询的状态。
	Unknown,

	/** This feature is fully available for use right now */

	// 这个功能目前是完全可用的。
	NowAvailable,

	/** This might be available after the completion of normal login procedures */

	// 在寻常登录进程完成之后也许是可用的。
	PossiblyAvailable,

	/** This feature is not available now because of something like network connectivity but may be available in the future */

	// 这个功能现在是不可用的，因为一些问题，像网络连接问题，但是未来也许是可用的。
	CurrentlyUnavailable,

	/** This feature will never be available for the rest of this session due to hard account or platform restrictions */

	// 此功能将会不在可用，因为违规账号的会话封禁或平台限制。
	AlwaysUnavailable,

	/** Invalid feature */

	// 此功能不可用。
	Invalid,
};

/** Enum giving specific reasons why a user may or may not use a certain privilege */

// 给定明确原因，用户也许使用或不使用一个明确权限的原因的枚举。
UENUM(BlueprintType)
enum class ECommonUserPrivilegeResult : uint8
{
	/** State is unknown and needs to be queried */

	// 未知的并且需要去查询的状态。
	Unknown,

	/** This privilege is fully available for use */

	// 这个权限是完全可用的。
	Available,

	/** User has not fully logged in */

	// 用户不能登录。
	UserNotLoggedIn,

	/** User does not own the game or content */

	// 用户不能登录游戏或上下文。
	LicenseInvalid,

	/** The game needs to be updated or patched before this will be available */

	// 这个游戏需要去更新或补丁在可用之前。
	VersionOutdated,

	/** No network connection, this may be resolved by reconnecting */

	//  没有网络连接，它也许通过重连可以解决。
	NetworkConnectionUnavailable,

	/** Parental control failure */

	// 父类的控制失败。
	// NOTE: 年龄限制。
	AgeRestricted,

	/** Account does not have a required subscription or account type */

	// 账户没有所需的订阅服务或账户类型。 
	AccountTypeRestricted,

	/** Another account/user restriction such as being banned by the service */

	// 另一种账号或用户限制情况，例如已经被该服务禁止。
	AccountUseRestricted,

	/** Other platform-specific failure */

	// 其他特定平台失败。
	PlatformFailure,
};

/** Used to track the progress of different asynchronous operations */

// 用于去跟踪不同异步操作进程的状态。
enum class ECommonUserAsyncTaskState : uint8
{
	/** The task has not been started */

	// 此任务还没有开始。
	NotStarted,
	/** The task is currently being processed */

	// 此任务当前正在进程中。
	InProgress,
	/** The task has completed successfully */

	// 此任务已经成功完成。
	Done,
	/** The task failed to complete */

	// 此任务没有完成。 
	Failed
};

/** Detailed information about the online error. Effectively a wrapper for FOnlineError. */

// 关于在线错误的细节信息。针对FOnlineError的有效封装。
USTRUCT(BlueprintType)
struct FOnlineResultInformation
{
	GENERATED_BODY()

		/** Whether the operation was successful or not. If it was successful, the error fields of this struct will not contain extra information. */

		// 这个操作是否成功。如果成功，这个结构体错误字段将不会包含额外信息。
		UPROPERTY(BlueprintReadOnly)
		bool bWasSuccessful = true;

	/** The unique error id. Can be used to compare against specific handled errors. */

	// 唯一错误ID。能用于特定处理的错误对比。
	UPROPERTY(BlueprintReadOnly)
		FString ErrorId;

	/** Error text to display to the user. */

	// 展示该用户的错误文本。
	UPROPERTY(BlueprintReadOnly)
		FText ErrorText;

	/**
	 * Initialize this from an FOnlineErrorType
	 * @param InOnlineError the online error to initialize from
	 */

	 /**
		 从FOnlineErrorType初始化。
	 */
	void COMMONUSER_API FromOnlineError(const FOnlineErrorType& InOnlineError);
};